#ifndef _ATOMIC_X86_H
#define _ATOMIC_X86_H

#include "types_x86.h"

// 原子交换 *addr 和 newval 两个值，返回 *addr 原有的值
static inline u32 xchg(volatile u32 *addr, u32 newval)
{
    u32 result;

    asm volatile("lock; xchgl %0, %1" :
               "+m" (*addr), "=a" (result) :
               "1" (newval) :
               "cc");

    return result;
}

#endif /* _ATOMIC_X86_H */